package com.guigu.qingcheng.service.impl;

import com.alibaba.fastjson.JSON;
import com.guigu.qingcheng.mapper.TbCategoryBrandMapper;
import com.guigu.qingcheng.mapper.TbCategoryMapper;
import com.guigu.qingcheng.mapper.TbSkuMapper;
import com.guigu.qingcheng.mapper.TbSpuMapper;
import com.guigu.qingcheng.pojo.TbCategory;
import com.guigu.qingcheng.pojo.TbCategoryBrand;
import com.guigu.qingcheng.pojo.TbSku;
import com.guigu.qingcheng.pojo.TbSpu;
import com.guigu.qingcheng.pojo.dto.GoodsDto;
import com.guigu.qingcheng.pojo.vo.Goods;
import com.guigu.qingcheng.pojo.vo.SkuGoodsVo;
import com.guigu.qingcheng.service.GoodsService;
import com.guigu.qingcheng.utils.IdWorker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Service
public class GoodsServiceImpl implements GoodsService {

    @Autowired(required = false)
    private TbSkuMapper tbSkuMapper;

    @Autowired(required = false)
    private TbSpuMapper tbSpuMapper;

    @Autowired
    private IdWorker idWorker;

    @Autowired(required = false)
    private TbCategoryMapper tbCategoryMapper;

    @Autowired(required = false)
    private TbCategoryBrandMapper tbCategoryBrandMapper;


    @Transactional
    @Override
    public void saveGoods(Goods goods) {
        // 保存spu信息
        TbSpu spu=goods.getSpu();
        spu.setId(idWorker.nextId()+"");
        tbSpuMapper.insert(spu);

        // 保存sku信息
        Date date=new Date();

        // 获取分类对象
        TbCategory tbCategory = tbCategoryMapper.selectByPrimaryKey(spu.getCategory3Id());

        List<TbSku> skuList = goods.getSkuList();
        for (TbSku sku:skuList){
            sku.setId(idWorker.nextId()+"");
            sku.setSpuId(spu.getId());

            // sku名称 =spu名称+规格值列表
            String name=spu.getName();
            //sku.getSpec()    String 类型.

            Map<String,String> specMap = JSON.parseObject(sku.getSpec(), Map.class);

            for (String value:specMap.values()){
                name+=" "+value;
            }
            sku.setName(name);
            sku.setCreateTime(date);
            sku.setUpdateTime(date);
            sku.setCategoryId(spu.getCategory3Id()); // 分类id
            sku.setCategoryName(tbCategory.getName()); // 分类名称
            sku.setCommentNum(0);
            sku.setSaleNum(0);

            tbSkuMapper.insert(sku);

        }
    }

    @Override
    public void addGoods(Goods goods) {
        // 从前端传过来的数据 goods 对象中获取到 spu 对象数据
        TbSpu spu = goods.getSpu();
        // 设置添加的商品未未审核
        spu.setStatus("0");
        // 设置为未删除
        spu.setIsDelete("0");
        // 设置为未上架
        spu.setIsMarketable("0");
        // 判断前端是否 传了 spu 对象 没有则添加
        if (spu.getId()==null){
            // 使用雪花算法设置获取到的 spu 对象数据的 id 属性
            spu.setId(idWorker.nextId() + "");
            // 把 spu 数据添加到数据库
            tbSpuMapper.insert(spu);
        }else { // 否则修改
            // 删除原来的 sku 列表数据
            Example example = new Example(TbSku.class);
            Example.Criteria criteria = example.createCriteria();
            criteria.andEqualTo("spuId", spu.getId());
            // 执行删除
            tbSkuMapper.deleteByExample(example);
            // 执行修改 spu 数据
            tbSpuMapper.updateByPrimaryKeySelective(spu);
        }
        if (spu.getSn()==null || "".equals(spu.getSn())) {
            spu.setSn(idWorker.nextId() + "");
        }

        // 创建时间对象 获取到当前时间  用于封装 sku 对象
        Date date = new Date();

        // 通过 spu 对象获取到分类 Id
        Integer category3Id = spu.getCategory3Id();
        // 通过分类 Id 查询到分类对象数据
        TbCategory category = tbCategoryMapper.selectByPrimaryKey(category3Id);

        // 获取的 goods 对象数据中的 skuList 集合
        List<TbSku> skuList = goods.getSkuList();
        // foreach skuList 集合
        for (TbSku sku:skuList) {
            // 判断规格值列表是否为空
            if (sku.getSpec() == null || "".equals(sku.getSpec())) {
                sku.setSpec("{}");
            }
            // 设置sku状态为正常
            sku.setStatus("1");
            // 使用雪花算法设置 sku 对象的 Id 属性
            sku.setId(idWorker.nextId() + "");
            if (sku.getSn()==null || "".equals(sku.getSn())) {
                sku.setSn(idWorker.nextId() + "");
            }
            // 把 spu 对象 Id 属性封装到 sku 对象中
            sku.setSpuId(spu.getId());

            // 拼接 sku 对象名称
            // sku 名称 = spu 名称 + 规格值列表
            String name = spu.getName();
            // 获取到规格值列表
            Map<String,String> map = JSON.parseObject(sku.getSpec(), Map.class);
            // foreach 规格列表 map
            for (String value:map.values()) {
                // 拼接 sku 对象名称
                name += " " + value;
            }

            // 封装 sku 名称属性
            sku.setName(name);
            // 封装创建日期
            sku.setCreateTime(date);
            // 封装修改日期
            sku.setUpdateTime(date);
            // 封装分类 Id
            sku.setCategoryId(category3Id);
            // 封装分类名称
            sku.setCategoryName(category.getName());
            // 封装评论数
            sku.setCommentNum(0);
            // 封装销售数量
            sku.setSaleNum(0);

            // 将 sku 对象添加到数据库
            tbSkuMapper.insert(sku);
        }

        // 在添加 spu 对象后 添加分类表和商品表的 关联数据
        TbCategoryBrand categoryBrand =new TbCategoryBrand();
        categoryBrand.setBrandId(spu.getBrandId());
        categoryBrand.setCategoryId(spu.getCategory3Id());
        int count=tbCategoryBrandMapper.selectCount(categoryBrand);
        if(count==0) {
            tbCategoryBrandMapper.insert(categoryBrand);
        }
    }

    @Override
    public Goods queryBySpuId(String spuId) {
        Goods goods = new Goods();
        goods.setSpu(tbSpuMapper.selectByPrimaryKey(spuId));
        Example example = new Example(TbSku.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("spuId",spuId);
        goods.setSkuList(tbSkuMapper.selectByExample(example));
        return goods;
    }

    @Override
    public String querySkuGoodsBySpec(SkuGoodsVo skuGoodsVo) {
        List<TbSku> skus = tbSkuMapper.querySkuGoodsBySpec(skuGoodsVo.getSpec(), skuGoodsVo.getSpuId());
        if(skus.size()>0){
            return skus.get(0).getId();
        }
        return null;
    }

    @Override
    public GoodsDto queryByGoodsName(String id) {
        GoodsDto goodsDto = tbSkuMapper.queryByGoodsName(id);
        return goodsDto;
    }

    @Override
    public List<TbSku> queryByGoodsLikeName(String name) {
        List<TbSku> skus = tbSkuMapper.queryByGoodsLikeName(name);
        return skus;
    }
}
